package com.mfn.sportjava.controller;

import com.mfn.sportjava.service.MatchAnalysisService;
import com.mfn.sportjava.util.DateUtils;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;

/**
 * @author Anyang
 * @version 1.0.1
 * @description 用于处理文件上传并触发比赛分析的REST控制器，支持指定分析风格
 * @date 2025/05/12
 */
@RestController
@RequestMapping("/sport")
@RequiredArgsConstructor
public class UploadController {
    private static final Logger log = LoggerFactory.getLogger(UploadController.class);
    private final MatchAnalysisService analysisService;

    /**
     * 处理包含比赛数据的JSON文件上传。
     * 触发比赛分析服务，并返回生成的报告作为可下载文件。
     *
     * @param file 上传的JSON文件。
     * @param styles （可选）一个或多个分析风格的名称列表。
     * 如果未提供，则使用默认风格。
     * @return 包含报告文件流或错误消息的ResponseEntity。
     */
    @PostMapping("/analysis/json")
    public ResponseEntity<?> uploadJsonFile(
            @RequestParam("file") MultipartFile file,
            @RequestParam(value = "styles", required = false) List<String> styles) {

        log.info("收到文件上传请求: {}, 请求的分析风格: {}", file.getOriginalFilename(), styles == null ? "默认" : String.join(", ", styles));
        try {
            // 将报告生成委托给服务层，并传递风格参数
            InputStreamResource resource = analysisService.generateAnalysisReport(file, styles);

            // 准备下载文件名
            String resultFileName = "predictions_" + DateUtils.generateTimestamp() + ".md";
            // 对文件名进行URL编码以处理特殊字符
            String encodedFileName = URLEncoder.encode(resultFileName, StandardCharsets.UTF_8).replace("+", "%20");

            log.info("成功生成报告。正在发送文件: {}", resultFileName);
            // 构建文件下载的响应实体
            return ResponseEntity.ok()
                    .contentType(MediaType.APPLICATION_OCTET_STREAM) // 或者 MediaType.TEXT_MARKDOWN_VALUE
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + encodedFileName + "\"")
                    .body(resource);

        } catch (IOException e) {
            log.error("处理文件 {} 时发生IO错误: {}", file.getOriginalFilename(), e.getMessage(), e);
            return ResponseEntity.internalServerError().body("文件处理失败: " + e.getMessage());
        } catch (IllegalArgumentException e) {
            log.warn("处理文件 {} 时发生参数错误: {}", file.getOriginalFilename(), e.getMessage());
            return ResponseEntity.badRequest().body("文件处理参数错误: " + e.getMessage());
        } catch (RuntimeException e) {
            log.warn("处理文件 {} 时发生运行时错误: {}", file.getOriginalFilename(), e.getMessage(), e);
            return ResponseEntity.status(500).body("文件处理时发生意外运行时错误: " + e.getMessage());
        } catch (Exception e) {
            log.error("处理文件 {} 时发生意外错误: {}", file.getOriginalFilename(), e.getMessage(), e);
            return ResponseEntity.internalServerError().body("发生内部错误，请稍后重试。");
        }
    }
}
